package com.example.custom_view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;

import androidx.core.content.ContextCompat;

import com.example.activity.R;


public class MyView extends View {

    private int textSize;
    private String textText;
    private int textColor;

    public MyView(Context context) {
        super(context);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 获取自定义属性
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyView);
        // 获取自定义属性并设置默认值
        textSize = array.getDimensionPixelSize(R.styleable.MyView_text_size, 15);
        textText = array.getString(R.styleable.MyView_text_text);
        textColor = array.getColor(R.styleable.MyView_text_color,Color.BLACK);
        // 当获取完TypedArray所有的属性值后，一般要调用recyle()方法来完成资源的回收，避免重新创建的时候的错误
        array.recycle();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 调用父View的onDraw函数，因为View这个类帮我们实现了一些基本的而绘制功能，比如绘制背景颜色、背景图片等
        super.onDraw(canvas);
        int r = getMeasuredWidth() / 2; // 获取半径，也可以是getMeasuredHeight()/2，本例中已经设置宽高相等了
        int centerX = getLeft() + r;    // 圆心的横坐标为当前的View的左边起始位置+半径
        int centerY = getTop() + r; // 圆心的纵坐标为当前的View的顶部起始位置+半径
        Paint p = new Paint();  // 定义画笔，绘制圆形
        // 根据/values/colors.xml中定义好的颜色，设置画笔颜色
        p.setColor(ContextCompat.getColor(this.getContext(), R.color.colorCircle));
        canvas.drawCircle(centerX, centerY, r, p);  // 绘制圆背景，设置圆心坐标
        // 定义蓝色画笔，绘制文字
        Paint paint = new Paint();
        paint.setColor(textColor);
        paint.setTextSize(textSize);
        // 绘制文字，设置起始基准线坐标
        Rect rect = new Rect();
        paint.getTextBounds(textText, 0, textText.length(), rect);
        int dx = getWidth() / 2 - rect.width() / 2;
        Paint.FontMetricsInt fontMetricsInt = paint.getFontMetricsInt();
        int dy = fontMetricsInt.bottom - fontMetricsInt.top;
        int baseLine = getHeight() / 2 + dy / 2;
        canvas.drawText(textText, dx, baseLine, paint);
    }

    private int getMySize(int defaultSize, int measureSpec) {
        // 设定一个默认大小 textSize
        int mySize = defaultSize;
        // 获得类型
        int mode = MeasureSpec.getMode(measureSpec);
        // 获得大小
        int size = MeasureSpec.getSize(measureSpec);
        switch (mode) {
            // 如果没有指定大小，就设置为默认大小
            case MeasureSpec.UNSPECIFIED:
                mySize = defaultSize;
                break;
            // 如果其大小没有限定，但有一个最大值，不可超过最大值，这里将大小取最大值size
            case MeasureSpec.AT_MOST:
                mySize = size;
                break;
            // 如果是固定的大小（大小确切限定的），那就不要去改变它
            case MeasureSpec.EXACTLY:
                mySize = size;
                break;
        }
        return mySize;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        // 分别获得长宽大小
        int width = getMySize(200, widthMeasureSpec);
        int height = getMySize(200, heightMeasureSpec);
        // 圆形控件，设定长宽相等
        width = Math.min(width, height);
        height = Math.min(width, height);
        // 设置大小
        setMeasuredDimension(width, height);
    }
}
